#include "gencode.h"

// gencode_init : création de liste doublement chaînée vide
gencode* gencode_init(void)
{
	gencode* table = malloc(sizeof(gencode));
	
	table->first = NULL;
	table->last  = NULL;
	
	return table;
}

// gencode_add : ajoute une ligne de code à la liste des lignes de code
//               en _fin_ de liste
gencode* gencode_add(gencode* table, const char* format, ...)
{
	va_list args;
	
	if (table == NULL)
	{
		table = gencode_init();
	}

	// allocation
	gencode_node* n = malloc(sizeof(gencode_node));
	gencode_node* tmp = NULL;
	
	// Contenu	
	va_start(args, format);
	n->str = (char*) g_strdup_vprintf((const gchar*) format, args);
	va_end(args);
	
	// Liste
	n->prec = NULL;
	n->next = NULL;
	
	// Ajout à la liste
	if (table->first == NULL)
	{
		table->first = n;
		table->last  = n;
	}
	else
	{
		tmp = table->last;
		tmp->next   = n;
		table->last = n;
	}
	
	return table;
}

// gencode_print : affiche le contenu de la liste des lignes de code
//                 en partant de la première jusqu'à la dernière
void gencode_print(gencode* table)
{
	if (table == NULL)
	{
		printf("(gencode vide)");
		return;
	}
	
	gencode_node* tmp = table->first;
	
	// Parcours de la table
	while (tmp != NULL)
	{
		printf("%s\n", tmp->str);
		tmp = tmp->next;
	}
}

// gencode_free : libère la place utilisée par la liste des lignes de code
void gencode_free(gencode* table)
{
	if (table == NULL) return;
	
	if (table->first == NULL)
	{
		free(table);
		return;
	}
	
	gencode_node* del = NULL;
	gencode_node* tmp = table->first;
	
	while (tmp != NULL)
	{
		free(tmp->str);
		
		del = tmp;
		tmp = tmp->next;
		
		free(del);
	}
	
	free(table);
}

